/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import Componenten.LocalTypes;
import Componenten.SQLiteConnector;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Klasse voor het ophalen van een level uit de SQLite DB
 * @author Bram Slob en Roderick van Seijen
 */
public class Level implements LocalTypes {
    
    private static final int AANTAL_KOLOMMEN = 20;
    private static final int AANTAL_RIJEN = 11;
    
    /**
     * Vraag een level in stringvorm op uit de SQLite DB.
     * @param levelCode Het levelnr voor het betreffende level
     * @return  Een stringrepresentatie van de gevraagde level.
     *          Een lege string indien de levelcode niet gevonden is.
     */
    public static String getLevel(int levelCode){
        String lvl = "";
        String sql = "SELECT levelstring FROM levels WHERE code = " + levelCode + ";";
        ResultSet rs = SQLiteConnector.runSelectQuery(sql);
        try {
            if (rs.next()){
                lvl = rs.getString("levelstring");
            }
        }
        catch (SQLException e){
            System.err.println(e);
        }
        
        System.out.println(lvl);
        return lvl;
    }
    
    /**
     * @return aantal kolommen van een level (gelijk voor alle levels)
     */
    public static int getAantalKolommen() {
        return AANTAL_KOLOMMEN;
    }
    
    /**
     * @return aantal rijen van een level (gelijk voor alle levels)
     */
    public static int getAantalRijen() {
        return AANTAL_RIJEN;
    }
    
    /**
     * @return  aantal levels in de SQLite DB
     */
    public static int getAantalLevels(){
        int aantal = 0;
        String sql = "SELECT COUNT(*) AS aantal_levels FROM levels;";
        ResultSet rs = SQLiteConnector.runSelectQuery(sql);
        try {
            if (rs.next()){
                aantal = rs.getInt("aantal_levels");
            }
        }
        catch (SQLException e){
            System.err.println(e);
        }
        
        return aantal;
    }
    
    /**
     * Set de highscore (aantal stappen) voor de gegeven level in de gegeven speelModus en spelVariant. 
     * De gegeven highscore dient lager te zijn dan de huidige highscore voor de level in de gegeven speelModus en spelVariant.
     * @param levelCode    Levelnummer van de level
     * @param speelModus   SpeelModus (KIND / VOLWASSENE).
     * @param highscore    Aantal stappen waarmee de level is gehaald
     */
    public static void setHighscore(int levelCode, Modus speelModus, SpelVariant variant, int highscore){
        String sqlField = getSQLField(speelModus, variant);
        String sql = "UPDATE levels SET " + sqlField + " = " + highscore + " WHERE code = " + levelCode + ";";
        SQLiteConnector.runUpdateQuery(sql);
    }
    
    
    /**
     * Geef de highscore voor de gegeven level, speelModus en spelvariant. Geef 0 terug als er nog geen highscore is.
     * @param levelCode    Levelnummer van de level
     * @param speelModus   SpeelModus (KIND / VOLWASSENE).
     * @param variant      De spelvariant (UITGEBREID / STANDAARD)
     * @return             Highscore: laagste aantal stappen waarmee de level is gehaald.
     */
    public static int getHighscore(int levelCode, Modus speelModus, SpelVariant variant){
        int highscore = 0;
        String sqlField = getSQLField(speelModus, variant);
        String sql = "SELECT " + sqlField + " AS score FROM levels WHERE code = " + levelCode + ";";
        
        ResultSet rs = SQLiteConnector.runSelectQuery(sql);
        try {
            if (rs.next()){
                highscore = rs.getInt("score");
            }
        }
        catch (SQLException e){
            System.err.println(e);
            highscore = 0;
        }
        
        return highscore;
        
    }
    
    /**
     * Verwijder de highscore (set 0 in DB) voor de gegeven level, speelModus en spelvariant.
     * @param levelCode        Levelnummer van de level
     * @param speelModus       SpeelModus (KIND / VOLWASSENE).
     * @param variant          De spelvariant (UITGEBREID / STANDAARD)
     */
    public static void verwijderHighscore(int levelCode, Modus speelModus, SpelVariant variant){
        String sqlField = getSQLField(speelModus, variant);
        String sql = "UPDATE levels SET " + sqlField + " = 0 WHERE code = " + levelCode + ";";
        SQLiteConnector.runUpdateQuery(sql);
    }
    
    /**
     * Geef het relevante veld in de DB voor de betreffende speelModus en spelvariant.
     * @param speelModus       SpeelModus (KIND / VOLWASSENE).
     * @param variant          De spelvariant (UITGEBREID / STANDAARD)
     * @return                 Het relevante veld in de DB.
     */
    private static String getSQLField(Modus speelModus, SpelVariant variant){
        String sqlField;
        if (variant == SpelVariant.UITGEBREID){
            if (speelModus == Modus.KIND){
                sqlField = "highscore_uitgebreid_kind";
            } else {
                sqlField = "highscore_uitgebreid";
            }
        } else {
            if (speelModus == Modus.KIND){
                sqlField = "highscore_kind";
            } else {
                sqlField = "highscore";
            }
        }
        return sqlField;
    }
    
    
    /**
     * Voeg een nieuwe level toe aan de DB (alleen voor dev gebruik).
     * @param levelCode    Levelnummer van de nieuwe level (dient uniek te zijn)
     * @param levelString  Stringrepresentatie van de nieuwe level.
     */
    public static void voegLevelToe(int levelCode, String levelString){
        String sql = "INSERT INTO levels (code, levelstring) VALUES(" + levelCode + ", '" + levelString + "');";
        SQLiteConnector.runUpdateQuery(sql);
    }
    
    /**
     * Verwijder een gegeven level (alleen voor dev gebruik).
     * @param levelCode    Levelnummer van de te verwijderen level
     */
    public static void verwijderLevel(int levelCode){
        String sql = "DELETE FROM levels WHERE code = " + levelCode + ";";
        SQLiteConnector.runUpdateQuery(sql);
    }
    
}

